/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
/*
 * bocciawii
 * Copyright (C) Grupo de trabajo ULE 2010 <ulewii@googlegroups.com>
 * 
 * teclado is free software: you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * teclado is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License along
 * with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef _MENSAJE_H_
#define _MENSAJE_H_
#include "elemento.h"
/**
 * @brief Implementación de un widget tipo 'text'
 *
 * Esta clase ofrece funcionalidad de un text. Hereda de Elemento.
 *
 * Puede estar acompañada por una imagen.
 *
 * El renderizado del texto se consigue gracias a la librería FTGL (apoyándose sobre freetype).
 * El tipo de fuentes utilizadas son FTGLPixmapFont, que son un tipo de fuentes raster
 * de esta librería.
 *
 * Estas fuentes son nuestra elección porque son bastante rápidas, tienen una calidad
 * bastante aceptable y valen para nuestros fines, ya que el dibujado del texto
 * se hará siempre sobre todo, en primer plano, y el texto nunca será transparente.
 *
 * El renderizado de texto se lleva a cabo através de un FTSimpleLayout, que más allá
 * de los beneficios obtenidos simplemente por FTGLPixmapFont, ofrece la posibilidad
 * de dibujar strings multilínea (hasta fin de línea o una longitud máxima dada) 
 * y alineaciones del texto (en caso de que sea multinea, claro)
 *
 * El texto se podrá dibujar con un tamaño determinado y un color determinado, 
 * pero todo el texto igual, es decir, aunque haya un string multilinea, no se podrá
 * dibujar la primera línea con color diferente al del resto ni nada por el estilo.
 * Esto es una limitación de esta clase, aunque desconocemos si FTGL ofrece esta
 * funcionalidad de una manera directa.
 *
 * Una manera rápida de darle a la clase algo más de utilidad sería
 * creando un procedimiento que asignara al texto a mostrar un string con el formato de
 * c (szFormat strings) como está implementado en la clase de logs, para asignar 
 * rápidamente tanto strings como valores numéricos al widget.
 */
class Mensaje:public Elemento 
{
public:
	/**
	 * @brief Constructor, inicializa el widget
	 *
	 * Inicializa el widget de texto, dando un identificador y una fuente con la
	 * que renderizar el texto.
	 * Se llama al constructor de la clase Elemento con id
	 * @param id identificador único del mensaje. Se sugiere que sea único en todo
	 * el super-contenedor (si se necesita acceder a él)
	 * @param fuente FTGLPixmapFont* de la fuente a utilizar.
	 */
	Mensaje(std::string id, FTGLPixmapFont* fuente);
	~Mensaje();

	/**
	 * @brief Setter para el texto
	 *
	 * Asigna un string como texto a mostrar
	 * @param text String con el texto
	 */
	void SetText(std::string text);

	/**
	 * @brief Setter para el texto
	 *
	 * Asigna un entero como texto a mostrar
	 * @param text String con el texto
	 */
	void SetText(int text);

	/**
	 * @brief Setter para el texto
	 *
	 * Asigna un float como texto a mostrar
	 * @param text String con el texto
	 */
	void SetText(float text);

	/**
	 * @brief Setter para la alineación del texto
	 *
	 * Asignará una alineación al texto, sólo si el texto es multilínea.
	 * Esta alineación es sólo para el texto contenido en el widget en cuestión, 
	 * no se asigna a los widgets en sí.
	 * @param align FTGL::TextAlignment enum con el deseado
	 * @param line_length Longitud de la línea (-1 por defecto: hasta \n)
	 */
	void SetTextAlign(FTGL::TextAlignment align, int line_length = -1);

	/**
	 * @brief Setter para el tamaño del texto
	 *
	 * Asigna el tamaño de la fuente
	 * @param size int con el tamaño de la fuente
	 */
	void SetSize(int size);

	/**
	 * @brief Setter para el color del texto
	 *
	 * Asigna un color al texto
	 * @param color float[3] con R, G y B
	 */
	void SetFGColor(float* color);

	/**
	 * @brief Getter para las coordenadas absolutas del widget
	 *
	 * Devuelve la posición del widget en pantalla en coordenadas absolutas de ventana.
	 * @return int[4] con x_inicio, x_final, y_inicio, y_final
	 */
	int* GetScreenCoords();

	/**
	 * @brief Getter para el espacio necesario del widget
	 *
	 * Devuevle el espacio necesario en píxeles para el widget. Se utiliza en los 
	 * procedimientos Pack() de los contenedores.
	 * @return int[2] con ancho, alto
	 */
	int* GetNeededSpace();

	/**
	 * @brief Transformar espacio necesario en coordenadas absolutas de pantalla
	 *
	 * A partir del espacio necesario del widget, y del centro donde deseemos que se
	 * encuentre el widget, se calcularán las coordenadas absolutas para el mensaje
	 * y la imagen, si tuviera
	 * @param centro_x la coordenada x del centro del widget
	 * @param centro_y la coordenada y del centro del widget
	 */
	void Pack(int centro_x, int centro_y);

	/**
	 * @brief Dibujado del widget
	 *
	 * Usa las coordenadas calculadas por el Pack(), esto es, si no se hace Pack()
	 * antes del dibujado el resultado es muy inesperado, para dibujar el widget en la 
	 * pantalla, tanto su imagen (si tuviera) como la barra con el porcentaje apropiado.
	 * Los colores origen y destino son utilizados, pero con la particularidad de que
	 * el color destino es tan sólo el porcentaje asignado a la barra del asignado 
	 * con SetFGColor()
	 */
	void Dibujar();
	
protected:
	/// La posición del texto
	text_alloc _posText;

	/// El centro del widget en coordenadas absolutas de la ventana
	int _centro_x;

	/// El centro del widget en coordenadas absolutas de la ventana
	int _centro_y;

	/// El tamaño de la fuente a utilizar
	int _textSize;

	/// float[3] con el color del texto
	float* _fgColor;

	/// El FTSimpleLayout que utilizaremos para renderizar el texto
	FTSimpleLayout* _layout;
	
private:

};

#endif // _MENSAJE_H_
